package spring.cloud.tasks.common;

import lombok.Getter;
import lombok.Setter;

/**
 * 1针对CPU和内存需要设置报警阈值，迫不得已的情况下对非核心的业务功能暂时不进行调度。设计降级模式：在热点时间段 非热点任务 暂时停止任务。ABC A级需要执行 B级可能执行 C级热点阶段不执行。
 * 2根据CPU 内存 硬盘。以及任务本身的CPU密集型还是IO密集型  单个分片占用CPU 内存 硬盘 以及数据库操作的执行时间进行划分。
 * 针对类似批次任务。每个阶段有不同的评估标准。以及尽量将批次权重比较大的部分均匀分散到执行器集群上面的节点里。
 */
@Setter
@Getter
public class Metrics {

    /**
     * CPU处理器个数
     */
    private int cpuProcessorNum;
    /**
     * CPU负载率
     */
    private double cpuLoadRatio;
    //
    /**
     * JVM最大内存, in GB.
     */
    private double jvmMaxMemory;
    /**
     * JVM已经使用的内存, in GB.
     */
    private double jvmUsedMemory;
    /**
     * JVM已经使用的内存率, 0.X,
     * the value is between 0 and 1.
     */
    private double jvmMemoryUsage;
    /**
     * 未使用内存
     */
    private double jvmFreeMemory;
    /**
     * 未使用内存率
     */
    private double jvmFreeUsage;
    //
    /**
     * 硬盘大小, in GB.
     */
    private double diskTotal;
    /**
     * 已经使用的硬盘大小, in GB.
     */
    private double diskUsed;

    /**
     * 硬盘使用率
     */
    private double diskUsage;
    /**
     * 未使用的硬盘大小, in GB.
     */
    private double diskUnUsed;

    /**
     * 硬盘未使用率
     */
    private double diskUnUsage;

    /**
     * Judge if the machine is available.
     */
    public boolean available(double maxCpuLoadRatio, double minMemorySpace, double minDiskSpace) {
        if (jvmFreeMemory < minMemorySpace) {
            return false;
        }
        if (diskUnUsage < minDiskSpace) {
            return false;
        }
        if (cpuLoadRatio <= 0.16) {//安全
            return true;
        }
        return !(cpuLoadRatio > maxCpuLoadRatio);
    }
}
